package com.nlelpct.utils;

import cn.hutool.core.util.ObjectUtil;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * @author :小马
 * @date : 2023-07-13
 */
public class DateTransformationUtils {
    /**
     * 默认的时间格式化
     */
    private static final DateTimeFormatter BASE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 将毫秒值转换为 LocalDateTime
     *
     * @param millisecond 毫秒值
     * @return 转换后的日期对象
     */
    public static LocalDateTime millisecondToLocalDateTime(Long millisecond) {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(millisecond), ZoneId.systemDefault());
    }

    /**
     * 将时间类转换为毫秒值，指定时区
     *
     * @param localDateTime 时间类
     * @param hours         指定的时区，如 `+8` 从`-18`到`+18`
     * @return 毫秒值
     */
    public static Long localDateTimeToMillis(LocalDateTime localDateTime, Integer hours) {
        Instant instant = localDateTime.toInstant(ZoneOffset.ofHours(hours));
        return instant.toEpochMilli();
    }

    /**
     * 将时间类转换为毫秒值，默认+8区
     *
     * @param localDateTime 时间类
     * @return 毫秒值
     */
    public static Long localDateTimeToMillis(LocalDateTime localDateTime) {
        return localDateTimeToMillis(localDateTime, 8);
    }


    /**
     * 格式化时间类
     *
     * @param localDateTime   时间类
     * @param formatterString 指定格式化样式，可为空。为空则为  "yyyy-MM-dd HH:mm:ss"
     * @return 格式化后的字符串
     */
    public static String localDateTimeToFormatter(LocalDateTime localDateTime, String formatterString) {
        DateTimeFormatter formatter;
        if (ObjectUtil.isEmpty(formatterString)) {
            formatter = BASE_FORMATTER;
        } else {
            formatter = DateTimeFormatter.ofPattern(formatterString);
        }
        return localDateTime.format(formatter);
    }


    /**
     * 格式化时间类
     *
     * @param millisecond     时间的毫秒值
     * @param formatterString 指定格式化样式，可为空。为空则为  "yyyy-MM-dd HH:mm:ss"
     * @return 格式化后的字符串
     */
    public static String millisecondToFormatter(Long millisecond, String formatterString) {
        return localDateTimeToFormatter(millisecondToLocalDateTime(millisecond), formatterString);
    }
}
